"""
权限控制装饰器
作者：资深Flask讲师
功能：基于角色的权限控制（RBAC）
"""

from functools import wraps
from flask import request, jsonify


def require_role(*allowed_roles):
    """
    角色权限控制装饰器
    :param allowed_roles: 允许访问的角色列表，如：'admin', 'manager', 'employee'
    用法：
        @require_role('admin')  # 只允许超级管理员访问
        @require_role('admin', 'manager')  # 允许超级管理员和部门经理访问
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            # 从request.user_info获取用户信息（由before_request拦截器设置）
            user_info = getattr(request, 'user_info', None)
            
            if not user_info:
                return jsonify({
                    "code": 401,
                    "message": "未授权：请先登录"
                }), 401
            
            # 获取用户角色
            user_role = user_info.get('role')
            
            # 检查角色是否在允许列表中
            if user_role not in allowed_roles:
                return jsonify({
                    "code": 403,
                    "message": f"权限不足：需要 {'/'.join(allowed_roles)} 角色"
                }), 403
            
            # 权限验证通过，执行原函数
            return f(*args, **kwargs)
        
        return decorated_function
    return decorator


def require_same_user_or_manager(user_id_param='user_id'):
    """
    要求是本人或者是部门经理
    :param user_id_param: URL参数中用户ID的参数名
    用法：
        @require_same_user_or_manager('user_id')  # 只允许本人或部门经理访问
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            from myflask.models.user import User
            
            # 从request.user_info获取当前登录用户信息
            current_user_info = getattr(request, 'user_info', None)
            
            if not current_user_info:
                return jsonify({
                    "code": 401,
                    "message": "未授权：请先登录"
                }), 401
            
            # 获取目标用户ID（从URL参数或请求体）
            target_user_id = kwargs.get(user_id_param) or request.json.get(user_id_param)
            
            if not target_user_id:
                return jsonify({
                    "code": 400,
                    "message": "缺少用户ID参数"
                }), 400
            
            # 超级管理员有所有权限
            if current_user_info.get('role') == 'admin':
                return f(*args, **kwargs)
            
            # 是否是本人
            if current_user_info.get('user_id') == int(target_user_id):
                return f(*args, **kwargs)
            
            # 是否是部门经理且是同部门
            if current_user_info.get('role') == 'manager':
                # 查询目标用户
                target_user = User.query.get(target_user_id)
                if target_user and target_user.department_id == current_user_info.get('department_id'):
                    return f(*args, **kwargs)
            
            # 权限不足
            return jsonify({
                "code": 403,
                "message": "权限不足：只能操作本人或本部门员工的数据"
            }), 403
        
        return decorated_function
    return decorator


def check_department_permission(department_id):
    """
    检查用户是否有权限访问指定部门
    :param department_id: 部门ID
    :return: True-有权限, False-无权限
    """
    user_info = getattr(request, 'user_info', None)
    
    if not user_info:
        return False
    
    # 超级管理员有所有部门权限
    if user_info.get('role') == 'admin':
        return True
    
    # 部门经理只能访问本部门
    if user_info.get('role') == 'manager':
        return user_info.get('department_id') == department_id
    
    # 普通员工只能访问本部门
    if user_info.get('role') == 'employee':
        return user_info.get('department_id') == department_id
    
    return False

